<?php
namespace app\controller;

use app\BaseController;
use app\model\SystemConfig as SystemConfigModel;
use think\facade\Validate;

class Config extends BaseController
{
    /**
     * 获取系统配置列表
     */
    public function index()
    {
        // 获取请求参数
        $params = $this->request->get();
        
        // 构建查询
        $query = SystemConfigModel::order('id', 'asc');
        
        // 按配置名称搜索
        if (!empty($params['config_name'])) {
            $query = $query->searchConfigNameAttr($params['config_name']);
        }
        
        // 按配置键名搜索
        if (!empty($params['config_key'])) {
            $query = $query->searchConfigKeyAttr($params['config_key']);
        }
        
        // 按配置类型搜索
        if (!empty($params['config_type'])) {
            $query = $query->searchConfigTypeAttr($params['config_type']);
        }
        
        // 按配置分组搜索
        if (!empty($params['group_name'])) {
            $query = $query->searchGroupNameAttr($params['group_name']);
        }
        
        // 按状态搜索
        if (isset($params['status']) && $params['status'] !== '') {
            $query = $query->searchStatusAttr($params['status']);
        }
        
        // 分页
        $list = $query->paginate([
            'list_rows' => $params['pageSize'] ?? 10,
            'page' => $params['page'] ?? 1,
        ]);
        
        return $this->success('获取成功', $list);
    }
    
    /**
     * 获取系统配置分组
     */
    public function groups()
    {
        // 获取所有分组
        $groups = SystemConfigModel::field('group_name')
            ->group('group_name')
            ->select();
        
        return $this->success('获取成功', $groups);
    }
    
    /**
     * 根据分组获取配置
     * @param string $group 分组名称
     */
    public function getConfigByGroup($group)
    {
        if (empty($group)) {
            return $this->error('分组名称不能为空');
        }
        
        $config = SystemConfigModel::getConfigByGroup($group);
        
        return $this->success('获取成功', $config);
    }
    
    /**
     * 获取配置详情
     * @param int $id 配置ID
     */
    public function detail($id)
    {
        // 验证参数
        if (!$id || !is_numeric($id)) {
            return $this->error('参数错误');
        }
        
        // 查询配置
        $config = SystemConfigModel::find($id);
        if (!$config) {
            return $this->error('配置不存在');
        }
        
        return $this->success('获取成功', $config);
    }
    
    /**
     * 添加配置
     */
    public function add()
    {
        // 获取请求数据
        $data = $this->request->post();
        
        // 验证数据
        $validate = Validate::rule([
            'config_name'  => 'require|max:100',
            'config_key'   => 'require|alphaDash|unique:system_config|max:100',
            'config_value' => 'require',
            'config_type'  => 'require|in:string,int,float,bool,json,array',
            'group_name'   => 'require|max:50',
            'status'       => 'require|in:0,1'
        ]);
        
        if (!$validate->check($data)) {
            return $this->error('参数错误：' . $validate->getError());
        }
        
        // 创建配置
        try {
            $config = SystemConfigModel::create([
                'config_name'  => $data['config_name'],
                'config_key'   => $data['config_key'],
                'config_value' => $data['config_value'],
                'config_type'  => $data['config_type'],
                'group_name'   => $data['group_name'],
                'remark'       => $data['remark'] ?? '',
                'status'       => $data['status']
            ]);
            
            return $this->success('添加成功', $config);
            
        } catch (\Exception $e) {
            return $this->error('添加失败：' . $e->getMessage());
        }
    }
    
    /**
     * 编辑配置
     */
    public function edit()
    {
        // 获取请求数据
        $data = $this->request->put();
        
        // 验证数据
        $validate = Validate::rule([
            'id'           => 'require|number',
            'config_name'  => 'require|max:100',
            'config_key'   => 'require|alphaDash|max:100',
            'config_value' => 'require',
            'config_type'  => 'require|in:string,int,float,bool,json,array',
            'group_name'   => 'require|max:50',
            'status'       => 'require|in:0,1'
        ]);
        
        if (!$validate->check($data)) {
            return $this->error('参数错误：' . $validate->getError());
        }
        
        // 查询配置
        $config = SystemConfigModel::find($data['id']);
        if (!$config) {
            return $this->error('配置不存在');
        }
        
        // 如果修改了键名，需要检查唯一性
        if ($data['config_key'] !== $config->config_key) {
            $existConfig = SystemConfigModel::where('config_key', $data['config_key'])->find();
            if ($existConfig) {
                return $this->error('配置键名已存在');
            }
        }
        
        // 更新配置
        try {
            $config->save([
                'config_name'  => $data['config_name'],
                'config_key'   => $data['config_key'],
                'config_value' => $data['config_value'],
                'config_type'  => $data['config_type'],
                'group_name'   => $data['group_name'],
                'remark'       => $data['remark'] ?? $config->remark,
                'status'       => $data['status']
            ]);
            
            return $this->success('更新成功');
            
        } catch (\Exception $e) {
            return $this->error('更新失败：' . $e->getMessage());
        }
    }
    
    /**
     * 删除配置
     * @param int $id 配置ID
     */
    public function delete($id)
    {
        // 验证参数
        if (!$id || !is_numeric($id)) {
            return $this->error('参数错误');
        }
        
        // 查询配置
        $config = SystemConfigModel::find($id);
        if (!$config) {
            return $this->error('配置不存在');
        }
        
        // 删除配置
        if ($config->delete()) {
            return $this->success('删除成功');
        } else {
            return $this->error('删除失败');
        }
    }
    
    /**
     * 批量保存配置
     */
    public function saveConfig()
    {
        // 获取请求数据
        $data = $this->request->post();
        
        if (empty($data) || !is_array($data)) {
            return $this->error('参数错误');
        }
        
        // 批量更新配置
        try {
            foreach ($data as $key => $value) {
                SystemConfigModel::setConfigValue($key, $value);
            }
            
            return $this->success('保存成功');
            
        } catch (\Exception $e) {
            return $this->error('保存失败：' . $e->getMessage());
        }
    }
    
    /**
     * 刷新缓存
     */
    public function refreshCache()
    {
        // 刷新缓存逻辑，可以根据实际情况实现
        // 例如清除缓存文件、重新生成配置缓存等
        
        return $this->success('刷新缓存成功');
    }
} 